package cn.xudy.async.service.impl;

import cn.xudy.async.Synchronized.MethodSync;

/**
 * Created by Ulegal on 2017/11/28.
 */
public class RunnableService implements Runnable {


    /**
     *  一、
     * test1 先于 test2 执行 同步方法，但是却后于 test2 结束。这里并没有达到互斥的效果！
     * 原因是：MethodSync是实例变量，每次创建一个Test对象就会创建一个MethodSync对象，
     * synchronized 只会锁定调用method()方法的那个MethodSync对象，
     * 而这里创建的两个线程分别拥有两个不同的MethodSync对象，它们调用method方法时就没有互斥关系。
     *
     */

    /**
     * 二、
     * 当把Test.java 中的MethodSync 变量 用 static 来修饰时，执行结果如下：
     * 这里，正确实现了同步作用。原因如下：这里也创建了二个线程(Test 对象)，
     * 但是每个Test对象共享MethodSync 变量，也即只有一个MethodSync 变量在两个线程中执行 method方法，
     * 这样两个线程在执行到method 方法这段代码时就会形成互斥
     *
     */

    private String name;

    private static MethodSync methodSync = new MethodSync();
//    private MethodSync methodSync = new MethodSync();

    public RunnableService(String name){
        this.name = name;
    }

    /**
     * run方法它本身启动不了多线程。多线程在实现的时候看着只是重写run方法
     * ，调用start方法启动，其实start方法里边还有其它操作：创建线程，调用run方法。
     */
    @Override
    public void run() {
        methodSync.method(name);
    }

    public static void main(String[] args) {
//         MethodSync methodSync = new MethodSync();
//        methodSync.method("你好1");
//        methodSync.method("你好2");
        Thread t1 = new Thread(new RunnableService("test 1"));
        Thread t2 = new Thread(new RunnableService("test 2"));
        t1.start();
        t2.start();

    }





}















